'use strict'
process.chdir(__dirname)
const titbit = require('titbit')
const fs = require('fs')
const pg = require('pg');
const {httpcli} = require('gohttp')   //使用HTTP/1.1的客户端
const wxkey = require('./wxkey.js')

const dbconfig = require('./dbconfig.js')
//初始化数据连接 
let psql = new pg.Pool(dbconfig)


const token = require('titbit-token')

let tok = new token({
    expires:30,
    key:'20010614200106142001061420010614',  //必须是32位
    iv:'tianyuxuan010614'  //必须是16位
})


try{
    fs.accessSync('./images')
}catch(err){
    fs.mkdirSync('./images')
}

let cert_path = '/usr/local/share'

const app = new titbit({
    //开启模式调试，会输出错误信息
    debug:true,
    cert:`${cert_path}/api.qasdwer.xyz.pem`,
    key:`${cert_path}/api.qasdwer.xyz.key`
})

// -------------------------content路由----------------------
app.get('/content',async c => {
    let sqltext = 'SELECT id,title,update_time FROM content'
    let r = await psql.query(sqltext)
    c.send(r.rows)
}) 
app.post('/content',async c => {
    try{
        //c.body是提交的请求体数据
        let data = JSON.parse(c.body)

        let sqltext = 'INSERT INTO content'
        +'(id,detail,title,add_time,update_time)'
        +' VALUES($1,$2,$3,$4,$5)'

        //随机数转成16进制字符串并去掉前两位，字符串作为ID
        let id = Math.random().toString(16).substring(2)//快捷 c.helper.makeId()
        let tm = Date.now()

        let r = await psql.query(sqltext,[
            id, data.detail, data.title, tm, tm
        ])

        if(r.rowCount === 0){
            return c.status(500).send('failed')
        }

        c.send(id)
    }catch(err){
        console.error(err)
        c.status(400).send('bad data')
    }
}) 
app.get('/content/:id',async c => {
    let id = c.param.id

    let sqltext = 'SELECT id,detail,title,update_time '
    +'FROM content WHERE id=$1';

    let r = await psql.query(sqltext,[id])

    if(r.rowCount === 0) return c.status(404).send('not found');

    c.send(r.rows[0])
}) 
//--------------------------contnent 路由 - END---------------



//c就是context
app.get('/',async c => {
    c.send('ok');
})

app.get('/upload',async c => {
    //c.helper是助手函数模块，其中有对stream.pipe的封装
    //c.reply是响应对象，http/1.1中指向response,http/2中指向stream
    await c.helper.pipe('./upload.html',c.reply)
})

//括号开头 加分号
// ;(async () => {

// })();

app.post('/upload',async c => {
    let f = c.getFile('file')

    if(!f){
        return c.status(400).send('file not found')
    }

    //生成唯一文件名，
    let fname = c.helper.makeName(f.filename)
    

    try{
        await c.moveFile(f,`./images/${fname}`)
        c.send(fname)
    }catch(err){
        c.status(500).send('failed')
    }

    
})

//:代表参数的路由，是动态路由  /image/a.jpg  只能是两层路径
app.get('/image/:name',async c => {
    let imgname = c.param.name

    try{
        await c.helper.pipe(`./images/${imgname}`,c.reply)
    }catch(err){
        c.status(404).send('image not found')
    }
})

app.get('/user/:name/:age/:mobile',async c => {
    console.log(c.param)
    c.send(c.param)
})//结果：{"name":"tian","age":"20","mobile":"liu"}


app.get('mp-login/:code',async c=>{
    c.send(c.param)
    let auth_ul = `https://api.weixin.qq.com/sns/jscode2session`
    +`?appid=${wxkey.appid}`
    +`&secret=${wxkey.secret}`
    +`&js_code=${c.param.code}`
    +`&grant_type=authorization_code`

    let ret = await httpcli.get(auth_ul)
                            .then(res => {
                                return res.json() //返回文本
                            })

    c.send(tok.make(ret))
})

//监听1234端口运行服务。
app.run(2020);